//#include <iostream>
//using namespace std;
//const int N = 1e5 + 10;
//struct node
//{
//	int d;
//	string v;
//}a[N];
//int main()
//{
//	int n, m; cin >> n >> m;
//	for (int i = 0; i < n; i++)
//	{
//		cin >> a[i].d >> a[i].v;
//	}
//	int ret = 0;
//	for (int i = 1; i <= m; i++)
//	{
//		int k, c; cin >> k >> c;
//		int w = a[ret].d;
//		if ((k == 0 && w == 1) || (k == 1 && w == 0))
//		{
//			ret += c;
//			ret %= n;
//		}
//		else
//		{
//			ret -= c;
//			ret = (ret % n + n) % n;
//		}
//	}
//	cout << a[ret].v << endl;
//	return 0;
//}
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e4 + 10,INF = 0x3f3f3f3f;
vector<int> e1[N];
vector<int> e2[N];
bool st[N];
int dist[N];
int s, t;
int n, m;
void dfs(int u)
{
	st[u] = true;
	for (auto& v : e2[u])
	{
		if(!st[v])
			dfs(v);
	}
}
bool check(int u)
{
	if (!st[u]) return false;
	for (auto v : e1[u])
	{
		if (!st[v]) return false;
	}
	return true;
}
int bfs(int s)
{
	if (!check(s)) return -1;
	memset(dist, 0x3f, sizeof dist);
	queue<int>q;
	q.push(s);
	dist[s] = 0;
	while (q.size())
	{
		int u = q.front(); q.pop();
		for (auto v : e1[u])
		{
			if (!check(v) || dist[v] != INF) continue;
			dist[v] = dist[u] + 1;
			q.push(v);
		}
	}
	return dist[t] == INF ? -1 : dist[t];

}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		int x, y; cin >> x >> y;
		e1[x].push_back(y);
		e2[y].push_back(x);
	}
	cin >> s >> t;

	dfs(t);

	cout << bfs(s) << endl;

	return 0;
}
